package org.jsola.hr.service;


import org.jsola.admin.dto.DictItemUpdateDTO;
import org.jsola.admin.entity.DictItemDO;
import org.jsola.admin.vo.AreaReduceVO;
import org.jsola.admin.vo.SiteListVO;
import org.jsola.approval.vo.UserApproListVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpInfoDAO;
import org.jsola.hr.dto.*;
import org.jsola.hr.dto.excel.EmpInfoImportDTO;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.query.*;
import org.jsola.hr.vo.*;
import org.jsola.hr.vo.excel.ParseResultVO;
import org.jsola.user.core.TokenUser;
import org.jsola.user.dto.UpdateByPhoneDTO;

import javax.validation.constraints.NotNull;
import java.io.File;
import java.util.List;
import java.util.Map;


/**
 * 员工信息
 *
 * @author zhr
 */
public interface IEmpInfoService extends IService<IEmpInfoDAO, EmpInfoDO> {


    /**
     * 添加待入职/入职员工发通知
     *
     * @param empInfoDO 员工信息
     * @param tokenUser 当前用户
     */
    void sendNotice(EmpInfoDO empInfoDO, TokenUser tokenUser);

    /**
     * 添加待入职/入职员工发通知
     *
     * @param empInfoId   员工id
     * @param subJectType subject类型
     * @param tokenUser   当前用户
     * @return 审批集合
     */
    List<UserApproListVO> empApproList(String empInfoId, String subJectType, TokenUser tokenUser);

    /**
     * 新增员工信息
     *
     * @param empInfoAddDTO 新增员工信息DTO
     * @param tokenUser     当前用户
     * @return 员工信息详情信息
     */
    EmpInfoVO save(EmpInfoAddDTO empInfoAddDTO, TokenUser tokenUser);

    /**
     * 批量新增员工信息
     *
     * @param empInfoAddDTOList 新增员工信息DTO
     * @param tokenUser         当前用户
     * @return 员工信息详情信息
     */
    List<EmpInfoVO> batchSave(List<EmpInfoAddDTO> empInfoAddDTOList, TokenUser tokenUser);

    /**
     * 签署状态分页查询员工列表
     *
     * @param empListQuery  员工信息查询对象
     * @param tokenUser     当前登录用户
     * @param SigningStatus 员工签署合同状态
     * @return 分页
     */
    Page<EmpInfoContractVO> pageEmpListBySigningStatus(EmpListQuery empListQuery, TokenUser tokenUser, Integer SigningStatus);


    /**
     * 粘贴选择：查询员工(发起合同用)
     *
     * @param idCards   身份证号 数组
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return result
     */
    EmpInfoPasteVO selectEmpInfoByIdCardsAddConUse(String[] idCards, String companyId, TokenUser tokenUser);


    /**
     * 修改员工信息
     *
     * @param empInfoUpdateDTO 修改员工信息DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(EmpInfoUpdateDTO empInfoUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工信息，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param empInfoIds 员工信息id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empInfoIds);

    /**
     * 根据员工信息id查找
     *
     * @param empInfoId 员工信息id
     * @param siteId    所属站点id
     * @return 员工信息详情信息
     */
    EmpInfoVO selectById(String empInfoId, String siteId);

    /**
     * 根据员工信息id查找
     *
     * @param empInfoId 员工信息id
     * @return 员工信息详情信息
     */
    EmpInfoDO selectById(String empInfoId);

    /**
     * 根据员工信息id查找 逻辑删除也查
     *
     * @param empInfoId 员工信息id
     * @return 员工信息详情信息
     */
    EmpInfoDO selectByIdNotValid(String empInfoId);

    /**
     * 查询员工信息
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工信息列表信息
     */
    List<EmpInfoListVO> select(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询员工信息记录数
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工信息记录数
     */
    int selectCount(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 分页查询员工信息
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工信息列表信息
     */
    Page<EmpInfoListVO> selectPage(EmpInfoQuery empInfoQuery, TokenUser tokenUser);


    /**
     * 根据员工信息id查找
     *
     * @param empInfoId 员工信息id
     * @param siteId    所属站点id
     * @return 员工信息
     */
    EmpInfoDO selectDOById(String empInfoId, String siteId);

    /**
     * 根据员工信息id查找被删除的也能查到
     *
     * @param empInfoId 员工信息id
     * @return 员工信息
     */
    EmpInfoDO selectDOByIdIgnoreValid(String empInfoId);

    /**
     * 根据员工信息id查找被删除的也能查到
     *
     * @param empInfoIds 员工信息id
     * @return 员工信息
     */
    List<EmpInfoDO> selectDoByIdsIgnoreValid(List<String> empInfoIds);

    /**
     * 根据员工信息id列表查找员工信息
     *
     * @param empInfoIds 员工信息id
     * @return 员工信息
     */
    List<EmpInfoDO> selectDoByIds(List<String> empInfoIds);

    /**
     * 根据员工信息id列表查找在职员工信息
     *
     * @param empInfoIds 员工信息id
     * @return 员工信息
     */
    List<EmpInfoDO> selectOnJobDoByIds(List<String> empInfoIds);



    /**
     * 查询指定月的在职员工
     *
     * @param companyId 用工单位Id
     * @param yearly    年
     * @param monthly   月
     * @param tokenUser 登录用户
     * @return 指定月的在职员工
     */
    List<EmpInfoDO> selectOnJobDoByMonthAndCompanyId(String companyId, int yearly, int monthly, TokenUser tokenUser);

    /**
     * 查询员工信息
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工信息列表
     */
    List<EmpInfoDO> selectDO(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询员工各状态数量
     *
     * @param tokenUser 当前用户
     * @param companyId 公司Id
     * @return 员工数量统计VO
     */
    EmpInfoCountVO getEmpInfoCount(String companyId, TokenUser tokenUser);

    /**
     * 查询员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoPageRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询待入职员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoPendingRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 待入职高级筛选（待入职+未到岗的）
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> pageWaitJobAdvanced(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 待入职高级筛选（待入职+未到岗的）
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    List<EmpInfoListVO> selectWaitJobAdvanced(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询待入职员工相关信息不分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息不分页
     */
    List<EmpInfoListVO> selectEmpInfoPendingRelationList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询在职员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoOnJobRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 粘贴选择：查询员工(查询在职员工相关信息)
     *
     * @param companyId 公司id
     * @param idCards   身份证号 数组
     * @param tokenUser 当前用户
     * @return 职员工相关信息
     */
    EmpInfoPasteVO selectEmpInfoOnJobRelationByIdCards(String[] idCards, String companyId, TokenUser tokenUser);

    /**
     * 查询在职员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息
     */
    List<EmpInfoListVO> selectEmpInfoOnJobRelationList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);


    /**
     * 查询待转正员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoToFormalRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询待转正员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息
     */
    List<EmpInfoListVO> selectEmpInfoToFormalRelationList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询离职员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoLeaveRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 粘贴选择：查询员工(查询离职员工相关信息)
     *
     * @param companyId 公司id
     * @param idCards   身份证号 数组
     * @param tokenUser 当前用户
     * @return 职员工相关信息
     */
    EmpInfoPasteVO selectEmpInfoLeaveRelationByIdCards(String[] idCards, String companyId, TokenUser tokenUser);


    /**
     * 查询离职员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息
     */
    List<EmpInfoListVO> selectEmpInfoLeaveRelationList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询调岗员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoTransferRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询调岗员工相关信息分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息
     */
    List<EmpInfoListVO> selectEmpInfoTransferRelationList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询员工可申请离职列表分页
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    Page<EmpInfoListVO> selectEmpInfoListForLeave(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询员工相关信息
     *
     * @param empInfoId 员工信息id
     * @param siteId    所属站点id
     * @return 员工信息详情相关
     */
    EmpAllInfoVO findEmpInfoRelation(String empInfoId, String siteId);

    EmpAllInfoVO findEmpInfoRelationAsync(String empInfoId, String siteId);

    /**
     * 查询员工相关信息
     *
     * @param userId    用户id
     * @param tokenUser 当前用户
     * @return 员工信息详情相关
     */
    EmpAllInfoVO findEmpInfoRelationByUserId(String userId, TokenUser tokenUser);

    /**
     * 查询员工相关信息，包括离职
     *
     * @param userId    用户id
     * @param tokenUser 当前用户
     * @return 员工信息详情相关
     */
    EmpAllInfoVO findEmpInfoRelationByUserId2(String userId, TokenUser tokenUser);

    /**
     * 获取某用户对应的员工
     *
     * @param userId 用户id
     * @param siteId 站点id
     * @return 某用户id对应的员工
     */
    List<EmpInfoDO> listByUserId(String userId, String siteId);

    /**
     * 获取某用户对应的员工，包括离职
     *
     * @param userId 用户id
     * @param siteId 站点id
     * @return 某用户id对应的员工
     */
    List<EmpInfoDO> listByUserId2(String userId, String siteId);

    /**
     * 获取某用户对应的员工，跨站点
     *
     * @param userId 用户id
     * @return 某用户id对应的员工
     */
    List<EmpInfoDO> listByUserIdNotSiteId(String userId);

    /**
     * 获取某用户对应的员工
     *
     * @param userIdList 用户id集合
     * @param siteId     站点id
     * @return 某用户id对应的员工
     */
    List<EmpInfoDO> listByUserIdList(List<String> userIdList, String siteId);

    /**
     * 查询员工岗位信息
     *
     * @param companyId 公司id
     * @param empInfoId 员工信息id
     * @param siteId    所属站点id
     * @return 员工信息详情相关
     */
    EmpInfoPositionVO findEmpInfoPosition(String companyId, String empInfoId, String siteId);

    /**
     * 查询员工列表及工资
     *
     * @param empInfoDO 查询条件
     * @param siteId    所属站点id
     * @return 员工列表及工资
     */
    List<EmpInfoDO> listWithSalary(EmpInfoDO empInfoDO, String siteId);

    /**
     * 根据公司id删除部门
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 保存员工基础信息
     *
     * @param empInfoAddDTO 员工基础信息
     * @param tokenUser     当前用户
     * @return 员工VO
     */
    EmpInfoVO saveEmpInfoPre(EmpInfoAddDTO empInfoAddDTO, TokenUser tokenUser);

    /**
     * 修改员工所有信息
     *
     * @param empAllInfoAddDTO 员工所有信息
     * @param tokenUser        当前用户
     * @return EmpInfoVO
     */
    EmpInfoVO saveEmpAllInfo(EmpAllInfoAddDTO empAllInfoAddDTO, TokenUser tokenUser);

    /**
     * 新增员工（外包类型使用）
     * 用 saveEmpAllInfo 方法
     *
     * @param empInfoAndRuleAddDTO 员工所有信息(包含薪资、劳务费规则)
     * @param tokenUser            当前用户
     * @return 员工信息
     */
    @Deprecated
    EmpInfoVO saveEmpInfoAndRule(EmpInfoAndRuleAddDTO empInfoAndRuleAddDTO, TokenUser tokenUser);

    /**
     * 根据规则生成的name
     *
     * @param salaryCalculateRuleAddDTO 规则新增对象
     * @param type                      类型
     * @return 根据规则生成的名字
     */
    String buildRuleName(SalaryCalculateRuleAddDTO salaryCalculateRuleAddDTO, Integer type);

    /**
     * 修改员工所有信息
     *
     * @param empAllInfoDTO 员工所有信息
     * @param tokenUser     当前用户
     * @return 修改数量
     */
    int updateEmpAllInfo(EmpAllInfoDTO empAllInfoDTO, TokenUser tokenUser);

    /**
     * 根据手机号查询员工信息(不包含离职)
     *
     * @param companyId 公司id
     * @param phone     手机号
     * @param siteId    站点id
     * @return 员工信息
     */
    EmpInfoVO selectByPhone(String companyId, String phone, String siteId);

    /**
     * 根据手机号查询在理员工信息 排除某用工单位
     *
     * @param excludeCompanyId 排除某用工单位
     * @param phone            手机号
     * @param siteId           站点id
     * @return 员工信息
     */
    EmpInfoDO selectOnJobByPhoneExcludeCompanyId(String excludeCompanyId, String phone, String siteId);

    /**
     * 根据number查询员工信息
     *
     * @param companyId 公司id
     * @param number    工号
     * @param siteId    站点id
     * @return 员工信息
     */
    EmpInfoVO selectByNumber(String companyId, String number, String siteId);

    /**
     * 根据手机号查询可入职的用户信息
     *
     * @param phone  手机号
     * @param siteId 站点
     * @return 可入职员工信息
     */
    List<EmpInfoListVO> listEntryByPhone(String phone, String siteId);

    /**
     * 根据unionId和信息状态查询用户信息
     *
     * @param unionId 微信unionId
     * @param status  信息状态
     * @return 用户信息
     */
    List<EmpInfoListVO> listByUnionId(String unionId, Integer status);

    /**
     * 通过用户审批
     *
     * @param empId     员工id
     * @param type      类型(入转调离)
     * @param tokenUser 当前用户
     */
    void passEmpAppro(String empId, String type, TokenUser tokenUser);

    /**
     * 拒绝用户审批
     *
     * @param empId     员工id
     * @param type      类型(入转调离)
     * @param tokenUser 当前用户
     */
    void rejectEmpAppro(String empId, String type, TokenUser tokenUser);

    /**
     * 确认到岗
     *
     * @param empInfoUpdateDTO 确认到岗信息
     * @param tokenUser        当前用户
     */
    void confirmToJoin(EmpInfoUpdateDTO empInfoUpdateDTO, TokenUser tokenUser);

    /**
     * 根据条件获取部门下的员工
     *
     * @param companyId       公司id
     * @param name            姓名
     * @param onlyUser        是否只显示有用户的员工
     * @param depIds          部门ids
     * @param tokenUser       当前用户
     * @param isOnlineOrLeave 在职或离职
     * @return 当前部门下所有员工
     */
    List<EmpReduceInfoVO> listEmpReduceByDepIds(String companyId, String name, Boolean onlyUser, Boolean isOnlineOrLeave, TokenUser tokenUser, String... depIds);

    /**
     * 获取员工的部门
     *
     * @param empId     员工id
     * @param empDepMap <empId,员工对应的部门>
     * @return 获取员工的部门
     */
    String getDepNameByEmpId(String empId, Map<String, List<EmpReduceInfoVO>> empDepMap);

    /**
     * 获取岗位下所有员工
     *
     * @param companyId   公司id
     * @param positionIds 岗位ids
     * @param tokenUser   当前用户
     * @return 岗位下所有员工
     */
    List<EmpReduceInfoVO> listEmpReduceByPositionIds(String companyId, TokenUser tokenUser, String... positionIds);

    /**
     * 获取当前部门下所有员工
     *
     * @param companyId       公司id
     * @param name            员工名称
     * @param onlyUser        只是有用户的员工
     * @param depIds          部门ids
     * @param tokenUser       当前用户
     * @param isOnlineOrLeave 在职或离职
     * @return 当前部门下所有员工
     */
    List<EmpInfoListVO> listAllVoByDepId(String companyId, String name, Boolean onlyUser, Boolean isOnlineOrLeave, TokenUser tokenUser, String... depIds);


    /**
     * 获取员工的岗位
     *
     * @param empId          员工id
     * @param empPositionMap <empId,员工对应的岗位>
     * @return 获取员工的岗位
     */
    String getPositionNameByEmpId(String empId, Map<String, List<EmpReduceInfoVO>> empPositionMap);

    /**
     * 获取岗位下所有员工
     *
     * @param companyId   公司id
     * @param positionIds 部岗位ids
     * @param tokenUser   当前用户
     * @return 岗位下所有员工
     */
    List<EmpInfoListVO> listAllVoByPositionId(String companyId, TokenUser tokenUser, String... positionIds);

    /**
     * 根据部门信息分页查询员工
     *
     * @param depAndInfoQuery 查询条件
     * @param tokenUser       当前用户
     * @return 员工分页列表
     */
    Page<EmpInfoListVO> pageEmpInfoByDepAndEmpInfo(DepAndInfoQuery depAndInfoQuery, TokenUser tokenUser);

    /**
     * 保存待入职员工
     *
     * @param empInfoOnJobDTO 待入职员工信息
     * @param tokenUser       当前用户
     */
    void saveOnJobEmpInfo(EmpInfoOnJobDTO empInfoOnJobDTO, TokenUser tokenUser);

    /**
     * 获取今天转正的员工
     *
     * @return 今天转正的员工
     */
    List<EmpInfoDO> listTurnStraightTaskToday();

    /**
     * 获取已转正的员工365天内退休的员工
     *
     * @return 已转正的员工365天内退休的员工
     */
    List<EmpInfoDO> listBeFormalTask();

    /**
     * 获取待转正的员工
     *
     * @return 待转正的员工
     */
    List<EmpInfoDO> listTurnOfficialTask();

    /**
     * 获取待离职的员工
     *
     * @return 待离职的员工
     */
    List<EmpInfoDO> listResignTask();

    /**
     * 获取待入职且不是未到岗的的员工
     *
     * @return 待入职的员工
     */
    List<EmpInfoDO> listInductionTask();

    /**
     * 获取调岗中的员工
     *
     * @return 调岗中的员工
     */
    List<EmpInfoDO> listTransferTask();

    /**
     * 更新员工unionId
     *
     * @param empId   员工id
     * @param unionId unionId
     */
    void updateEmpUnionId(@NotNull String empId, @NotNull String unionId);

    /**
     * 查询要导出的员工信息
     *
     * @param empInfoExportQuery 查询条件
     * @param tokenUser          登录用户
     * @return 要导出的员工信息列表
     */
    String selectExportList(EmpInfoExportQuery empInfoExportQuery, TokenUser tokenUser);

    /**
     * 解析要导入的excel并返回解析结果
     *
     * @param file      文件
     * @param success   是否只返回解析成功的，如果false，则只返回失败的，为null全部返回
     * @param tokenUser 当前用户
     * @return 解析结果
     */
    List<ParseResultVO<EmpInfoImportDTO>> parseImportFile(File file, Boolean success, TokenUser tokenUser);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param force     true忽略错误的行，false有错误中断上传
     * @param companyId 公司Id
     * @return 成功的条数
     */
    @Deprecated
    EmpImportExcelVO importFile(File file, TokenUser tokenUser, Boolean force, String companyId);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param force     true忽略错误的行，false有错误中断上传
     * @param companyId 公司Id
     * @return 成功的条数
     */
    EmpImportExcelVO importFileZhiXinRen(File file, TokenUser tokenUser, Boolean force, String companyId);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param force     true忽略错误的行，false有错误中断上传
     * @return 成功的条数
     */
    EmpImportExcelVO importZhiXinRenForSite(File file, TokenUser tokenUser, Boolean force);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @param force     true忽略错误的行，false有错误中断上传
     * @param companyId 公司Id
     * @return 成功的条数
     */
    EmpImportExcelVO importFileZhiXinRenForUpdate(File file, TokenUser tokenUser, Boolean force, String companyId);


    /**
     * 导出excel，导入前会校验数据，如果有失败的数据则不导入
     *
     * @param empIds    选择的员工Id
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 成功的条数
     */
    String exportByEmpIds(List<String> empIds, String companyId, TokenUser tokenUser);

    /**
     * 保存Excel导入的考勤记录
     *
     * @param list      导入数据
     * @param isAdd     是否为新增操作
     * @param tokenUser 当前用户
     * @param companyId 公司Id
     * @return 员工
     */
    @Deprecated
    EmpImportExcelVO saveExcelDataList(List<EmpInfoImportDTO> list, Boolean isAdd, TokenUser tokenUser, String companyId);

    /**
     * 多线程保存Excel导入的员工信息
     *
     * @param list      导入数据
     * @param isAdd     是否为新增操作；true：新增，false：修改
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 员工
     */
    EmpImportExcelVO asyncSaveExcelDataList(List<EmpInfoImportDTO> list, boolean isAdd, String companyId, TokenUser tokenUser);

    /**
     * 多线程保存Excel导入的员工信息
     *
     * @param list      导入数据
     * @param isAdd     是否为新增操作；true：新增，false：修改
     * @param tokenUser 当前用户
     * @return 员工
     */
    EmpImportExcelVO asyncSaveExcelDataListBySite(List<EmpInfoImportDTO> list, boolean isAdd, TokenUser tokenUser);

    /**
     * 根据地区名称获取地区信息
     *
     * @param areaList 所有地区
     * @param name     地区名称
     */
    String getAreaInfoByName(List<AreaReduceVO> areaList, String name);

    /**
     * 获取在职员工列表(在职和待离职)
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工
     */
    Page<EmpInfoListVO> pageOnJobEmpList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 完善个人信息
     *
     * @param empIdList
     * @param tokenUser
     */
    void empCompleteInfo(List<String> empIdList, TokenUser tokenUser);

    /**
     * 根据公司id获取在职员工列表(在职和待离职)
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 员工DO List
     */
    List<EmpInfoDO> onJobEmpDOList(String companyId, TokenUser tokenUser);

    /**
     * 获取在职员工基本信息列表(在职和待离职)
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工
     */
    Page<EmpInfoListVO> pageBaseOnJobEmpList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);


    /**
     * 获取在职员工(在职和待离职) 的Id姓名和手机号
     *
     * @param companyId      公司Id
     * @param empNameOrPhone 姓名或手机号
     * @param pageNo         页码
     * @param pageSize       页面大小
     * @param tokenUser      当前用户
     * @return 员工Id姓名和手机号
     */
    Page<EmpInfoListVO> selectIdNamePhoneOnJobEmpList(String companyId, String empNameOrPhone
            , Integer pageNo, Integer pageSize, TokenUser tokenUser);

    /**
     * 花名册动态表头,给 empInfo 对象以外的属性赋值
     *
     * @param empInfoListVO 员工信息
     * @param tokenUser     当前用户
     */
    @Deprecated
    void otherHeaderAssignment(EmpInfoListVO empInfoListVO, TokenUser tokenUser);

    /**
     * 批量花名册动态表头,给 empInfo 对象以外的属性赋值
     *
     * @param empInfoListVO 员工信息
     * @param tokenUser     当前用户
     */
    void batchOtherHeaderAssignment(List<EmpInfoListVO> empInfoListVO, TokenUser tokenUser);


    /**
     * 查询当前员工在列表中的位置
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工位置
     */
    EmpInfoCurrentPositionVO getEmpCurrentPosition(EmpInfoQuery empInfoQuery, TokenUser tokenUser);


    /**
     * 查询员工未完善信息
     *
     * @param companyId 公司Id
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 员工未完善信息
     */
    String notComplete(String companyId, String empId, TokenUser tokenUser);

    /**
     * 查询员工未完善信息
     *
     * @param companyId 公司Id
     * @param empIdList 员工Id
     * @param tokenUser 当前用户
     * @return 员工未完善信息
     */
    Map<String, String> listNotComplete(String companyId, List<String> empIdList, TokenUser tokenUser);

    /**
     * 获取在职员工列表(在职和待离职)
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 员工
     */
    List<EmpInfoListVO> listOnJobEmpList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询员工相关合同信息
     *
     * @param empIdList  员工ID集合
     * @param templateId 模板
     * @param siteId     站点
     * @return List<EmpInfoListVO>
     */
    List<EmpInfoContractVO> getEmpInfoListForContract(String[] empIdList, Long templateId, String siteId);


    /**
     * 查询员工相关合同信息
     *
     * @param contractEmpInfoDTO 条件
     * @param siteId             站点
     * @return List<EmpInfoListVO>
     */
    List<EmpInfoContractVO> getEmpContractInfoList(ContractEmpInfoDTO contractEmpInfoDTO, String siteId);

    /**
     * 获取已调岗员工列表
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 已调岗员工列表
     */
    Page<EmpInfoListVO> pageTransfer(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询员工信息接部门.岗位信息
     *
     * @param empInfoId 员工id
     * @param siteId    站点id
     * @return 员工信息接部门.岗位信息
     */
    EmpInfoListVO selectEmpAndDepPositionById(String empInfoId, String siteId);


    /**
     * 校验手机号是否已出任其他公司(站点下无论员工状态)
     *
     * @param phone     手机号
     * @param siteId    站点id
     * @param tokenUser
     */
    void checkByPhone(String phone, String siteId, TokenUser tokenUser);

    /**
     * 校验手机号是否已出任其他公司
     *
     * @param companyId 要出任的公司id
     * @param idCard    身份证号
     * @param siteId    站点id
     */
    void checkOnJobIdCard(String companyId, String idCard, String siteId);

    /**
     * 获取公司下无部门的员工
     *
     * @param companyId      公司id
     * @param empReduceQuery 查询条件
     * @param tokenUser      当前用户
     * @return 公司下无部门的员工
     */
    List<EmpReduceInfoVO> listNoDepEmp(String companyId, EmpReduceQuery empReduceQuery, TokenUser tokenUser);

    /**
     * 获取公司下所有员工
     *
     * @param companyId      公司id
     * @param empReduceQuery 查询条件
     * @param tokenUser      当前用户
     * @return 公司下无部门的员工
     */
    List<EmpReduceInfoVO> listOnJobByCompanyId(String companyId, EmpReduceQuery empReduceQuery, TokenUser tokenUser);

    /**
     * 查询某公司所有员工工作城市
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 某公司所有员工工作城市
     */
    Map<String, String> listEmpJoinCity(String companyId, String siteId);


    /**
     * 获取公司下在职的员工
     *
     * @param companyId 公司id
     * @param siteId    站点
     * @return 公司下在职的员工
     */
    List<EmpInfoDO> listOnJobByCompanyId(String companyId, String siteId);


    /**
     * 获取公司下全部员工
     *
     * @param companyId 公司id
     * @param siteId    站点
     * @return 公司下在职的员工
     */
    List<EmpInfoDO> listByCompanyId(String companyId, String siteId);

    /**
     * 查询离职员工相关信息列表
     *
     * @param empInfoQuery 员工信息参数
     * @param tokenUser    当前用户
     * @return 员工相关信息分页
     */
    List<EmpInfoListVO> listLeaveRelation(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 员工修改手机号发送验证码
     *
     * @param oldPhone  旧手机号
     * @param newPhone  要更换的手机号
     * @param tokenUser 当前用户
     * @return 成功与否
     */
    boolean sendChangePhoneMessage(String oldPhone, String newPhone, TokenUser tokenUser);

    /**
     * 修改员工手机号
     *
     * @param oldPhone  旧手机号
     * @param newPhone  要更换的手机号
     * @param captcha   验证码
     * @param tokenUser 当前用户
     */
    void updateEmpPhone(String oldPhone, String newPhone, String captcha, TokenUser tokenUser);

    /**
     * 根据条件筛选符合条件的员工
     *
     * @param empInfoScreenDTO 条件
     * @param tokenUser        当前用户
     * @return 符合条件的员工
     */
    List<EmpInfoListVO> screenEmp(EmpInfoScreenDTO empInfoScreenDTO, TokenUser tokenUser);

    /**
     * 校验必填
     *
     * @param empAllInfoDTO 填写的信息
     * @param empInfoDO     之前的信息
     * @param siteId        站点
     * @return 校验结果
     */
    String necessary(EmpAllInfoDTO empAllInfoDTO, EmpInfoDO empInfoDO, String siteId);

    /**
     * 根据手机号查询员工所有站点ID集合
     *
     * @param phone     手机号
     * @param tokenUser 当前用户
     * @return 站点ID集合
     */
    List<String> getSiteIdListByPhone(String phone, TokenUser tokenUser);

    /**
     * 根据手机号查询员工所有站点VO集合
     *
     * @param phone     手机号
     * @param tokenUser 当前用户
     * @return 站点ID集合
     */
    List<SiteListVO> getSiteListVOByPhone(String phone, TokenUser tokenUser);

    /**
     * 根据手机号查询员工所有站点VO集合
     *
     * @param unionId   unionId
     * @param tokenUser 当前用户
     * @return 微信绑定
     */
    WeChatSiteBindVO checkBindByUnionId(String unionId, TokenUser tokenUser);

    /**
     * 获取公司下员工对应的用户
     *
     * @param companyId 公司id
     * @param siteId    站点
     * @return 公司下员工对应的用户
     */
    List<String> listEmpUserIdByCompany(String companyId, String siteId);

    /**
     * 获取公司下所有员工id
     *
     * @param companyId
     * @param siteId
     * @return
     */
    List<String> listEmpIdByCompany(String companyId, String siteId);

    /**
     * 校验传入参数是否必填，（定位到字段是否必填）
     *
     * @param empAllInfoDTO 用户信息
     * @param companyId     公司id
     * @param siteId        站点
     * @return 校验结果
     */
    String checkField(EmpAllInfoDTO empAllInfoDTO, String companyId, String siteId);

    /**
     * 更新当前站点下的所有员工姓名拼音
     *
     * @param tokenUser 当前信息
     * @return 更新个数
     */
    Integer pinyin(TokenUser tokenUser);

    /**
     * 获取用户在某公司对应的员工
     *
     * @param companyId 公司id
     * @param userId    用户id
     * @param siteId    站点id
     * @return 用户在某公司对应的员工
     */
    EmpInfoDO getEmpInfoByCompanyAndUser(String companyId, String userId, String siteId);

    /**
     * 根据id获取员工信息
     *
     * @param siteId 站点id
     * @param empIds 员工ids
     * @return 员工信息
     */
    List<EmpInfoDO> listEmpInfoByIds(String siteId, String... empIds);

    /**
     * 获取员工简略信息及部门
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工简略信息及部门id
     */
    List<EmpReduceInfoVO> listEmpReduceAndDepInfo(String companyId, String siteId);

    /**
     * 获取员工简略信息及岗位
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工简略信息及岗位id
     */
    List<EmpReduceInfoVO> listEmpReduceAndPositionInfo(String companyId, String siteId);


    /**
     * 获取部门下员工信息
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 部门下员工信息
     */
    List<EmpReduceInfoVO> listDepEmpInfo(String companyId, String siteId);

    /**
     * 获取员工对应的部门map,<empId,对应的部门>
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工对应的部门map
     */
    Map<String, List<EmpReduceInfoVO>> getEmpDepMap(String companyId, String siteId);

    /**
     * 获取员工对应的岗位map,<empId,对应的岗位>
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 员工对应的岗位map
     */
    Map<String, List<EmpReduceInfoVO>> getEmpPositionMap(String companyId, String siteId);


    /**
     * 获取根据条件获取部门下员工信息
     *
     * @param empReduceQuery 员工查询条件
     * @param companyId      公司id
     * @param tokenUser      当前用户
     * @return 符合条件的员工
     */
    List<EmpReduceInfoVO> listDepEmpInfoByCondition(EmpReduceQuery empReduceQuery, String companyId, TokenUser tokenUser);

    /**
     * 根据员工id更新userId
     *
     * @param empId  员工id
     * @param userId 用户id
     */
    void updateEmpUserIdById(String empId, String userId);

    /**
     * 根据用户Id查找一条员工信息
     *
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    EmpInfoDO selectEmpByUserId(TokenUser tokenUser);

    /**
     * 根据userId查询员工
     *
     * @param userIds 用户id
     * @return 员工
     */
    List<EmpInfoDO> selectByUserIds(List<String> userIds);

    /**
     * 根据companyIds查询员工 已删除员工也需要查询
     *
     * @param companyIds 用工单位Ids
     * @return 员工
     */
    List<EmpInfoDO> selectByCompanyIdsNotValid(List<String> companyIds);

    /**
     * 根据userId、companyIds查询员工 已删除员工也需要查询
     *
     * @param companyIds 用工单位Ids
     * @param userIds    用户id
     * @return 员工
     */
    List<EmpInfoDO> selectByCompanyIdsAndUserIdsNotValid(List<String> companyIds, List<String> userIds);

    /**
     * 根据userId查询员工
     *
     * @param userId    用户id
     * @param companyId 公司id
     * @param siteId    租户id
     * @return 员工
     */
    EmpInfoDO selectByUserId(String userId, String companyId, String siteId);


    /**
     * 员工换公司
     *
     * @param empChangeCompanyDTO 用户信息
     * @param tokenUser           当前用户
     * @return 员工换公司结果
     */
    String empChangeCompanyId(EmpChangeCompanyDTO empChangeCompanyDTO, TokenUser tokenUser);

    /**
     * 员工批量换公司
     *
     * @param empBatchChangeCompanyDTO 用户信息
     * @param tokenUser                当前用户
     * @return 员工换公司结果
     */
    String empBatchChangeCompanyId(EmpBatchChangeCompanyDTO empBatchChangeCompanyDTO, TokenUser tokenUser);

    /**
     * 根据用户身份证号查找一条员工信息（待入职+入职）
     *
     * @param companyId 公司id
     * @param idCard    身份证号
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    EmpInfoDO selectEmpByIdCard(String companyId, String idCard, TokenUser tokenUser);

    /**
     * 根据用户身份证号查找一条员工信息（非离职）
     *
     * @param companyId 公司id
     * @param idCard    身份证号
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    EmpInfoDO selectOnJobEmpByIdCard(String companyId, String idCard, TokenUser tokenUser);

    /**
     * 根据身份证号查询员工
     *
     * @param companyId  公司id
     * @param idCardList 身份证号列表
     * @param tokenUser  当前用户
     * @return 员工列表
     */
    List<EmpInfoDO> selectEmpByIdCardList(String companyId, List<String> idCardList, TokenUser tokenUser);

    /**
     * 根据用户身份证号查找一条员工信息（所有员工状态，返回第0条）
     *
     * @param companyId 公司id
     * @param idCard    身份证号
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    EmpInfoDO selectEmpByIdCardAllStatus(String companyId, String idCard, TokenUser tokenUser);

    /**
     * 根据公司id和员工id集合查找在职员工信息, empIdList为空时查询公司全部员工
     *
     * @param companyId   公司id
     * @param empIdList   员工id集合
     * @param nameOrPhone 姓名/手机号,为空则跳过此条件
     * @param tokenUser   当前用户
     * @return 员工信息集合
     */
    List<EmpInfoDO> selectOnJobByCompanyIdAndEmpIdList(String companyId, List<String> empIdList, String nameOrPhone,
                                                       TokenUser tokenUser);


    /**
     * 根据公司id和员工id集合查找所有员工信息（包括不在职的）, empIdList为空时查询公司全部员工
     *
     * @param companyId   公司id
     * @param empIdList   员工id集合
     * @param nameOrPhone 姓名/手机号,为空则跳过此条件
     * @param status      员工状态
     * @param tokenUser   当前用户
     * @return 员工信息集合
     */
    List<EmpInfoDO> selectByCompanyIdAndEmpIdList(String companyId, List<String> empIdList, String nameOrPhone,
                                                  Integer status, TokenUser tokenUser);

    /**
     * 根据用户Id查询站点下在职员工
     *
     * @param userId    用户Id
     * @param tokenUser 登录用户
     * @return 根据用户Id查询站点下在职员工
     */
    EmpInfoDO selectOnJobByUserIdAndSiteId(String userId, TokenUser tokenUser);

    /**
     * 查询公司已离职的员工
     *
     * @param companyId 公司Id
     * @param empId     员工Id
     * @return 司已离职的员工
     */
    EmpInfoDO selectResignedByCompanyIdAndEmpId(String companyId, String empId);

    /**
     * 查询公司已离职的员工
     *
     * @param companyId 公司Id
     * @param idCard    身份证号
     * @return 司已离职的员工
     */
    EmpInfoDO selectResignedByCompanyIdAndIdCard(String companyId, String idCard);


    /**
     * 查询使用手机号的员工
     *
     * @param phone 手机号
     * @return 使用手机号的员工
     */
    List<EmpInfoDO> selectByPhoneNotSiteId(String phone);

    /**
     * 查询使用手机号的在职员工
     *
     * @param phone 手机号
     * @return 使用手机号的员工
     */
    List<EmpInfoDO> selectOnJobByPhoneNotSiteId(String phone);

    /**
     * 恢复在职
     *
     * @param companyId 公司Id
     * @param empId     员工Id
     * @param tokenUser 登录用户
     * @return 恢复在职
     */
    Integer reinstatement(String companyId, String empId, TokenUser tokenUser);

    /**
     * 批量恢复在职
     *
     * @param companyId 公司Id
     * @param empIds    员工Id
     * @param tokenUser 登录用户
     * @return 恢复在职
     */
    Integer reinstatement(String companyId, List<String> empIds, TokenUser tokenUser);

    /**
     * 给我一堆员工Id,我给你一堆员工姓名
     *
     * @param empIdList 员工Id
     * @return 员工姓名
     */
    List<String> getEmpNameByIdList(List<String> empIdList);

    /**
     * 企业端首页员工统计
     *
     * @param tokenUser     当前用户
     * @param year          年
     * @param month         月
     * @param companyIdList 公司Id列表
     * @return 统计信息
     */
    StatisticsPageVO selectHomeEmpCountByMonth(TokenUser tokenUser, String year, String month, List<String> companyIdList);

    /**
     * 根据员工姓名,身份证号查询
     *
     * @param empName   员工姓名
     * @param idCard    身份证号
     * @param tokenUser 当前用户
     * @param companyId 公司Id
     * @return 员工Id
     */
    EmpInfoDO selectEmpByNameAndIdCard(String empName, String idCard, String companyId, TokenUser tokenUser);

    /**
     * 根据手机号,查找一个在职或者离职的员工
     *
     * @param phone     电话
     * @param tokenUser 当前用户
     * @return 员工
     */
    EmpInfoDO selectByPhone(String phone, TokenUser tokenUser);

    /**
     * 查询员工自定义查询属性
     *
     * @param id         员工Id
     * @param tokenUser  当前用户
     * @param properties 需要查询的属性
     * @return 员工
     */
    EmpInfoDO selectPropertyById(String id, TokenUser tokenUser, String... properties);

    /**
     * 查询在职员工数量根据公司Id列表
     *
     * @param companyIdList 公司Id列表
     * @param tokenUser     当前用户
     * @return 员工数量
     */
    int selectCountByCompanyIdList(List<String> companyIdList, TokenUser tokenUser);

    /**
     * 查询待入职员工数量根据公司Id列表
     *
     * @param companyIdList 公司Id列表
     * @param tokenUser     当前用户
     * @return 员工数量
     */
    int selectWaitEmpCountByCompanyIdList(List<String> companyIdList, TokenUser tokenUser);

    /**
     * 查询离职员工数量根据公司Id列表
     *
     * @param companyIdList 公司Id列表
     * @param tokenUser     当前用户
     * @return 员工数量
     */
    int selectLeaveEmpCountByCompanyIdList(List<String> companyIdList, TokenUser tokenUser);

    /**
     * 补收补缴查询员工
     *
     * @param empSocPageQuery 查询参数
     * @param siteId          站点
     * @return
     */
    Page<EmpInfoDO> pageByFill(EmpSocPageQuery empSocPageQuery, String siteId);

    /**
     * 增员查询员工
     *
     * @param empSocPageQuery 查询参数
     * @param siteId          站点id
     * @return 员工信息
     */
    Page<EmpInfoDO> increaseSiftEmp(EmpSocPageQuery empSocPageQuery, String siteId);

    /**
     * 增员筛选员工统计
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 统计信息
     */
    List<SiftEmpCountVO> increaseSiftEmpCount(String companyId, TokenUser tokenUser);

    /**
     * 减员查询员工
     *
     * @param empSocPageQuery 查询参数
     * @param siteId          站点id
     * @return 员工信息
     */
    Page<EmpInfoDO> decreaseSiftEmp(EmpSocPageQuery empSocPageQuery, String siteId);

    /**
     * 减员筛选员工统计
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 统计信息
     */
    List<SiftEmpCountVO> decreaseSiftEmpCount(String companyId, TokenUser tokenUser);

    /**
     * 根据身份证号查询员工列表
     *
     * @param idCards   身份证号 数组
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 员工信息List
     */
    EmpInfoPasteVO selectEmpGroupByIdCards(String[] idCards, String companyId, TokenUser tokenUser);

    /**
     * 根据身份证号查询员工列表
     *
     * @param idCards   身份证号 数组
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 员工信息List
     */
    EmpInfoPasteVO selectEmpGroupByIdCards2(String[] idCards, String companyId, TokenUser tokenUser);


    /**
     * 根据员工Id列表查询员工的社保简略信息
     *
     * @param empSocTransformQuery 减员参数
     * @param tokenUser            当卡用户
     * @return 社保简略信息
     */
    Page<EmpSocDetailsVO> selectEmpSocByEmpIdList(EmpSocTransformQuery empSocTransformQuery, TokenUser tokenUser);

    /**
     * 社保差额费用筛选员工
     *
     * @param empSocPageQuery 是否筛选本账单人员
     * @param tokenUser       当前用户
     * @return 员工列表
     */
    Page<EmpInfoDO> selectDifferenceEmp(EmpSocPageQuery empSocPageQuery, TokenUser tokenUser);

    /**
     * 社保差额费用粘贴身份证号筛选员工
     *
     * @param idCards   身份证号
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 筛选结果
     */
    EmpInfoPasteVO pasteIdCardSelect(String[] idCards, String companyId, TokenUser tokenUser);

    /**
     * 查询站点下的所有员工
     *
     * @param tokenUser     当前用户
     * @param companyIdList 公司Id列表
     * @return 员工
     */
    List<EmpInfoDO> selectEmpBySiteIdAndCompanyIdList(List<String> companyIdList, TokenUser tokenUser);

    /**
     * 查询工作性质分类的员工列表
     *
     * @param companyId  公司id
     * @param formalType 试用正式
     * @param tokenUser  当前登录用户
     * @return 员工列表
     */
    List<EmpPostTypeListVO> selectEmpListByPostType(String companyId, Integer formalType, TokenUser tokenUser);

    /**
     * 分页查询员工列表
     *
     * @param empListQuery 员工信息查询对象
     * @param tokenUser    当前登录用户
     * @return 分页
     */
    Page<EmpInfoVO> pageEmpList(EmpListQuery empListQuery, TokenUser tokenUser);

    /**
     * 根据身份证号查询员工列表
     *
     * @param idCards   身份证号 数组
     * @param tokenUser 当前用户
     * @return 员工信息List
     */
    EmpInfoPasteVO empListByIdCards(String[] idCards, String companyId, TokenUser tokenUser);

    /**
     * 根据身份证查询员工信息
     *
     * @param idCardList 身份证
     * @param tokenUser  当前用户
     * @return list
     */
    List<EmpInfoDO> listByIdCardList(List<String> idCardList, TokenUser tokenUser);

    /**
     * 根据正式类型,公司id,员工性质查询在职员工
     *
     * @param formalTypeList 正式类型（1:试用期,2:已转正,0:无状态）,null则跳过
     * @param companyId      公司id
     * @param postTypeList   员工性质,null则跳过
     * @param tokenUser      当前用户
     * @return 员工列表
     */
    List<EmpInfoDO> selectOnJobEmpListByFormalTypeAndCompanyIdAndPostType(List<String> formalTypeList, String companyId,
                                                                          List<String> postTypeList, TokenUser tokenUser);


    /**
     * 搜索员工姓名\手机号\身份证号
     *
     * @param phoneNameIdCard 员工姓名\手机号\身份证号
     * @param tokenUser       登录用户
     * @return 前10条
     */
    List<EmpInfoVO> selectByPhoneNameIdCard(String phoneNameIdCard, TokenUser tokenUser);

    /**
     * 分页搜索员工姓名\手机号\身份证号
     *
     * @param phoneNameIdCard 员工姓名\手机号\身份证号
     * @param pageNo          分页参数，第几页
     * @param pageSize        分页参数，每页的条数
     * @param tokenUser       登录用户
     * @return 前10条
     */
    Page<EmpInfoVO> selectPageByPhoneNameIdCard(String phoneNameIdCard, int pageNo, int pageSize, TokenUser tokenUser);


    /**
     * 查询站点下使用指定手机号的员工
     *
     * @param phones 手机号
     * @param siteId 站点Id
     * @return 站点下使用手机号的员工
     */
    List<EmpInfoDO> selectByPhonesAndSiteId(List<String> phones, String siteId);


    /**
     * 查询租户下所有员工
     *
     * @param tokenUser 当前用户
     * @return 员工
     */
    List<EmpInfoDO> selectSiteEmp(TokenUser tokenUser);

    /**
     * 查询用工单位下指定状态的员工
     *
     * @param companyIdList 公司Id
     * @param status        员工状态
     * @param siteId        站点Id
     * @return 站点下使用手机号的员工
     */
    List<EmpInfoDO> selectByCompanyIdAndStatus(List<String> companyIdList, Integer status, String siteId);

    /**
     * 查询用工单位下的员工
     *
     * @param companyIds 公司Id
     * @param siteId     站点Id
     * @return 站点下使用手机号的员工
     */
    List<EmpInfoDO> selectAllByCompanyIds(List<String> companyIds, String siteId);

    /**
     * 查询站点下使用手机号的员工
     *
     * @param phones    手机号
     * @param companyId 公司Id
     * @param siteId    站点Id
     * @return 站点下使用手机号的员工
     */
    List<EmpInfoDO> selectByPhonesAndCompanyId(List<String> phones, String companyId, String siteId);

    /**
     * 根据员工类型分页查询员工
     *
     * @param empInfoQuery 查询参数
     * @param tokenUser    当前用户
     * @return 员工
     */
    Page<EmpInfoDO> selectPageByPostType(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 根据员工姓名和手机号,查询一条员工信息
     *
     * @param phone     手机号
     * @param name      姓名
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    EmpInfoDO selectByPhoneAndName(String phone, String name, String companyId, TokenUser tokenUser);

    /**
     * 根据员工姓名和身份证号,查询一条员工信息
     *
     * @param idCard    身份证号
     * @param name      姓名
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    EmpInfoDO selectIdCardAndPhone(String idCard, String name, String companyId, TokenUser tokenUser);

    /**
     * 根据公司id,查询员工信息
     *
     * @param companyId   公司Id
     * @param nameOrPhone 姓名或手机号
     * @param filter      是否过滤在职员工
     * @param tokenUser   当前用户
     * @return 员工信息
     */
    List<EmpInfoVO> selectByCompanyId(String companyId, String nameOrPhone, Boolean filter, TokenUser tokenUser);

    /**
     * 根据公司id,默认查询月初还在职员工信息
     *
     * @param companyIds  公司Id
     * @param yearly      年
     * @param monthly     月
     * @param empStatus   员工状态
     * @param nameOrPhone 姓名或手机号
     * @param tokenUser   当前用户
     * @return 员工信息
     */
    List<EmpInfoVO> selectByCompanyIds(List<String> companyIds, int yearly, int monthly
            , Integer empStatus, String nameOrPhone, TokenUser tokenUser);

    /**
     * 工价薪资档案分页查询所有员工信息
     *
     * @param salaryCalculateRuleEmpInfoQuery 查询
     * @param tokenUser                       当前用户
     * @return 员工信息
     */
    Page<EmpInfoVO> pageByCompanyId(SalaryCalculateRuleEmpInfoQuery salaryCalculateRuleEmpInfoQuery, TokenUser tokenUser);

    /**
     * 工价薪资档案分页查询所有员工信息
     *
     * @param empId       员工id
     * @param companyId   公司Id
     * @param nameOrPhone 姓名或手机号
     * @param status      员工状态
     * @param channelId   渠道id
     * @param tag         标签
     * @param pageNo      pageNo
     * @param pageSize    pageSize
     * @param tokenUser   当前用户
     * @return 员工信息
     */
    Page<EmpInfoVO> pageByCompanyId(String empId, String companyId, String nameOrPhone, Integer status,
                                    String channelId, String tag, Integer pageNo, Integer pageSize, TokenUser tokenUser);

    /**
     * 工价薪资档案查询所有员工信息
     *
     * @param empId       员工id
     * @param companyId   公司Id
     * @param nameOrPhone 姓名或手机号
     * @param status      员工状态
     * @param channelId   渠道id
     * @param tokenUser   当前用户
     * @return 员工信息
     */
    List<EmpInfoDO> listByCompanyId(String empId, String companyId, String nameOrPhone, Integer status,
                                    String channelId, TokenUser tokenUser);

    /**
     * 更新员工工价规则和劳务费规则
     *
     * @param salaryRuleDTO 修改工价规则对象
     * @param tokenUser     当前用户
     * @return 修改数量
     */
    Integer updateSalaryRule(SalaryRuleDTO salaryRuleDTO, TokenUser tokenUser);

    /**
     * 查询员工固定薪资档案列表,包含离职
     *
     * @param companyId           公司id
     * @param nameOrPhoneOrIdCard 姓名/手机号/身份证
     * @param employType          聘用形式（0：非正式，1：正式）
     * @param postType            工作性质/岗位类型
     * @param formalType          正式类型（1:试用期,2:已转正,0:无状态）
     * @param status              员工状态
     * @param siteId              站点
     * @return 员工信息
     */
    List<EmpInfoDO> selectAllByCompanyId(String companyId, String nameOrPhoneOrIdCard, String employType, String postType,
                                         String formalType, Integer status, String siteId);

    /**
     * 根据员工Id查询是否按基础工资计算应发
     *
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 是否按基础工资计算应发
     */
    Boolean isFixedEmp(String empId, TokenUser tokenUser);

    /**
     * 根据凭证更换手机号
     *
     * @param updateByPhoneDTO 修改对象
     * @param tokenUser        当前登录用户
     */
    void updatePhoneByVoucher(UpdateByPhoneDTO updateByPhoneDTO, TokenUser tokenUser);

    /**
     * 更换手机号
     *
     * @param oldPhone  修改前手机号
     * @param newPhone  修改后手机号
     * @param tokenUser 登录用户
     */
    void updatePhone(String oldPhone, String newPhone, TokenUser tokenUser);

    /**
     * 批量未到岗
     *
     * @param empIds 员工id
     * @return 修改条数
     */
    Integer batchNoArrival(String[] empIds, TokenUser tokenUser);

    /**
     * 批量确认到岗（入职）
     *
     * @param empInfoUpdateDTOList 修改员工信息DTO集合
     * @return 修改条数
     */
    Integer batchConfirmToJoin(List<EmpInfoUpdateDTO> empInfoUpdateDTOList, TokenUser tokenUser);

    /**
     * 重新入职
     *
     * @param empId  员工id
     * @param flowId 审批模板id
     * @return 修改条数
     */
    Integer onJobAgain(String empId, String flowId, TokenUser tokenUser);

    /**
     * 查询使用标签的员工
     *
     * @param companyId   用工单位id
     * @param siteId      站点id
     * @param tagNameList 标签
     * @return 员工
     */
    List<EmpInfoDO> selectByTags(String companyId, String siteId, List<String> tagNameList);

    /**
     * 小程序人员统计
     *
     * @param empCountQuery 查询对象
     * @param tokenUser     当前用户
     * @return 统计对象
     */
    EmpCountVO empCount(EmpCountQuery empCountQuery, TokenUser tokenUser);

    /**
     * 小程序我的员工-详情
     *
     * @param empId     员工id
     * @param tokenUser 当前用户
     * @return 员工详情
     */
    MyEmpInfoVO selectByEmpId(String empId, TokenUser tokenUser);

    /**
     * 查询公司下所有员工
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 员工
     */
    List<EmpInfoDO> selectEmpByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 小程序人员分页
     *
     * @param empCountQuery 查询对象
     * @param tokenUser     当前用户
     * @return 分页对象
     */
    Page<EmpInfoVO> pageEmpListForMini(EmpCountQuery empCountQuery, TokenUser tokenUser);

    /**
     * 分页查询外包在职员工
     *
     * @param companyIds  用工单位id
     * @param nameOrPhone 姓名/手机号
     * @param channelId   渠道id
     * @param pageNo      当前第几页
     * @param pageSize    每页的条数
     * @param siteId      租户id
     * @return 分页对象
     */
    Page<EmpInfoVO> pageOutsource(String[] companyIds, String nameOrPhone, String channelId, Integer pageNo,
                                  Integer pageSize, String siteId);


    /**
     * 查询在职及当月离职的员工
     *
     * @param companyId   公司Id
     * @param nameOrPhone 姓名或手机号
     * @param yearly      年
     * @param monthly     月
     * @param pageNo      分页参数，第几页
     * @param pageSize    分页参数，每页的条数
     * @param tokenUser   用户Id
     * @return 在职及当月离职的员工
     */
    Page<EmpInfoVO> selectCurrentMonthByCompanyId(String companyId, String nameOrPhone, int yearly
            , int monthly, int pageNo, int pageSize, TokenUser tokenUser);

    /**
     * 查询在职及当月离职的员工
     *
     * @param companyId 公司Id
     * @param yearly    年
     * @param monthly   月
     * @param tokenUser 用户Id
     * @return 在职及当月离职的员工
     */
    List<EmpInfoDO> selectCurrentMonthByCompanyId(String companyId, int yearly, int monthly, TokenUser tokenUser);

    /**
     * 查询未定薪薪资档案
     *
     * @param empInfoQuery 查询对象
     * @param tokenUser    当前用户
     * @return 未定薪员工
     */
    Page<EmpInfoVO> pageNoFixSalaryFile(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 粘贴选择：查询员工(查询薪资档案用)
     *
     * @param companyId 公司id
     * @param idCards   身份证号 数组
     * @param tokenUser 当前用户
     * @return 未定薪员工
     */
    EmpInfoPasteVO selectNoFixSalaryFileGroupByIdCards(String[] idCards, String companyId, TokenUser tokenUser);


    /**
     * 根据员工手机号/身份证号 查询站点下已离职员工
     *
     * @param companyId 公司Id
     * @param phone     电话
     * @param idCard    身份证
     * @param tokenUser 当前用户
     * @return 已离职员工
     */
    EmpInfoCheckVO selectResignedByPhoneAndIdCard(String companyId, String phone, String idCard, TokenUser tokenUser);

    /**
     * 根据userId、companyId查询员工(查询不到返回null，多个会返回最新的一条)
     *
     * @param userId    用户id
     * @param companyId 公司id
     * @return 员工
     */
    EmpInfoDO selectByUserIdAndCompanyId(String userId, String companyId);

    /**
     * 根据userId、companyId查询员工(查询不到返回null，多个会返回最新的一条)
     *
     * @param userId    用户id
     * @param companyId 公司id
     * @return 员工
     */
    EmpInfoDO selectByUserIdAndCompanyIdNotValid(String userId, String companyId);

    /**
     * 查询用工单位下所有符合条件的员工信息
     *
     * @param empInfoQuery 查询条件
     * @param tokenUser    当前用户
     * @return 用工单位下所有符合条件的员工信息
     */
    Page<EmpInfoListVO> selectAllByEmpInfoQuery(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询用工单位下所有身份证号符合的员工信息
     *
     * @param companyId 用工单位Id
     * @param cardList  身份证号
     * @param tokenUser 当前用户
     * @return 用工单位下所有符合条件的员工信息
     */
    CheckInEmpInfoListVO selectAllByCompanyIdAndIdCard(String companyId, List<String> cardList, TokenUser tokenUser);

    /**
     * 指定手机号在用工单位下是否存在离职员工
     *
     * @param companyId 用工单位id
     * @param phone     手机号
     * @param tokenUser 当前用户
     * @return true；有； false：无；
     */
    boolean hasEmpResignByPhone(String companyId, String phone, TokenUser tokenUser);

    /**
     * 查询手机号在用工单位下的离职员工
     *
     * @param companyId 用工单位id
     * @param phoneList 手机号
     * @param tokenUser 当前用户
     * @return list
     */
    List<EmpInfoDO> listEmpResignByPhone(String companyId, List<String> phoneList, TokenUser tokenUser);

    /**
     * 指定身份证在用工单位下是否存在离职员工
     *
     * @param companyId 用工单位id
     * @param idCard    身份证
     * @param tokenUser 当前用户
     * @return true；有； false：无；
     */
    boolean hasEmpResignByIdCard(String companyId, String idCard, TokenUser tokenUser);

    /**
     * 查询身份证在用工单位下的离职员工
     *
     * @param companyId  用工单位id
     * @param idCardList 身份证
     * @param tokenUser  当前用户
     * @return list
     */
    List<EmpInfoDO> listEmpResignByIdCard(String companyId, List<String> idCardList, TokenUser tokenUser);

    /**
     * 粘贴选择待入职
     *
     * @param idCardList 身份证号
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 员工信息列表
     */
    CheckInEmpInfoListVO listPasteWaitJob(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 粘贴选择查询在职待转正员工
     *
     * @param idCardList 身份证号
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 员工信息列表
     */
    CheckInEmpInfoListVO listPasteFormal(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 粘贴选择在职
     *
     * @param idCardList 身份证号
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 员工信息列表
     */
    CheckInEmpInfoListVO listPasteOnJob(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 粘贴选择待离职 （状态为待离职和审批通过）
     *
     * @param idCardList 身份证号
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 员工信息列表
     */
    CheckInEmpInfoListVO listPasteWaitLeave(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 粘贴选择待调岗员工（审批通过+ 待调岗）
     *
     * @param idCardList 身份证
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 员工信息列表
     */
    CheckInEmpInfoListVO listPasteTransferRelation(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 批量恢复在职
     *
     * @param companyId 用工单位id
     * @param empIds    员工ids
     * @param tokenUser 当前用户
     * @return 恢复在职数量
     */
    Integer batchReinstatement(String companyId, String[] empIds, TokenUser tokenUser);


    /**
     * 批量删除已离职员工高级筛选
     *
     * @param empInfoQuery 查询信息
     * @param tokenUser    当前用户
     * @return 可以删除的已离职员工信息
     */
    Page<EmpInfoListVO> pageResignedList(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 粘贴选择已离职员工
     *
     * @param idCardList 身份证
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 离职员工列表
     */
    CheckInEmpInfoListVO listPasteResigned(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 分页查询可以恢复在职的员工
     *
     * @param empInfoQuery 查询参数
     * @param tokenUser    当前用户
     * @return 员工信息
     */
    Page<EmpInfoListVO> pageReinstatementEmp(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询可以恢复在职的员工
     *
     * @param empInfoQuery 查询参数
     * @param tokenUser    当前用户
     * @return 员工信息
     */
    List<EmpInfoListVO> listReinstatementEmp(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 查询不可以恢复在职的员工身份证号（已在其他公司入职）
     *
     * @param idCards   身份证号
     * @param companyId 离职的用工单位id
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    List<String> listIdCardListCanResumeWork(List<String> idCards, String companyId, TokenUser tokenUser);

    /**
     * 查询不可以恢复在职的员工手机号（已在其他公司入职）
     *
     * @param phones    手机号
     * @param companyId 离职的用工单位id
     * @param tokenUser 当前用户
     * @return 员工信息
     */
    List<String> listPhoneListCanResumeWork(List<String> phones, String companyId, TokenUser tokenUser);

    /**
     * 粘贴选择可以恢复在职的员工
     *
     * @param idCardList 身份证号了表
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 可以恢复在职的员工信息
     */
    CheckInEmpInfoListVO listPasteReinstatementEmp(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 待转正可以批量离职分页(在职未转正的,不包含待离职的)相关信息
     *
     * @param empInfoQuery 查询信息
     * @param tokenUser    当前用户
     * @return 分页
     */
    Page<EmpInfoListVO> selectForLeave(EmpInfoQuery empInfoQuery, TokenUser tokenUser);

    /**
     * 粘贴选择查询可以离职的待转正员工
     *
     * @param idCardList 身份证号
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 可以离职的待转正员工
     */
    CheckInEmpInfoListVO listPasteFormalForLeave(List<String> idCardList, String companyId, TokenUser tokenUser);

    /**
     * 粘贴选择：查询员工(薪资档案用)
     *
     * @param empInfoQuery 查询
     * @param tokenUser    当前用户
     * @return 粘贴选择结果
     */
    EmpInfoPasteVO selectEmpByCardAndSalaryType(EmpInfoQuery empInfoQuery, TokenUser tokenUser);


    /**
     * 批量调薪和批量编辑工价规则
     *
     * @param empInfoUpdateDTO 员工信息更新实体
     * @param tokenUser        当前用户
     * @return 失败为0成功为1
     */
    Integer batchUpdateSalaryInfo(EmpInfoUpdateDTO empInfoUpdateDTO, TokenUser tokenUser);


    /**
     * 查询所选员工 的最晚入职时间（如果最晚早于当前则返回当前时间）
     *
     * @param empListQuery 查询条件
     * @return 时间戳
     */
    Long getEmpJoinDate(EmpListQuery empListQuery, TokenUser tokenUser);

    /**
     * 查询用工单位下指定状态的员工
     *
     * @param companyIds 公司Id List
     * @param status     员工状态
     * @param idCard     身份证号
     * @param siteId     站点Id
     * @return 站点下使用手机号的员工
     */
    List<EmpInfoDO> selectByCompanyIdsAndStatusAndIdCard(List<String> companyIds, Integer status, String idCard, String siteId);

    /**
     * 根据手机号或员工姓名、用工单位idList、身份证号（可为空） 查询花名册信息 已删除的也查到了
     *
     * @param nameOrPhone   手机号
     * @param companyIdList 用工单位id List
     * @param idCard        身份证号
     * @param tokenUser     当前用户
     * @return 花名册List
     */
    List<EmpInfoDO> selectByNameOrPhoneAndCompanyIdAndIdCard(String nameOrPhone, List<String> companyIdList, String idCard, TokenUser tokenUser);


    /**
     * 根据员工Id查询员工简略信息
     *
     * @param empIdList 员工id
     * @return 员工简略信息
     */
    List<EmpReduceInfoVO> selectEmpReduceInfoByIdList(List<String> empIdList);

    /**
     * 批量插入
     *
     * @param empInfoList 插入对象
     * @return int
     */
    int insertListAndSetId(List<EmpInfoDO> empInfoList);

    /**
     * 查找员工（花名册、预登记）信息（必填+自定义）
     *
     * @param queryType           查询方式(1：预登记，2：花名册(按员工在职状态) 3：待入职 4：入职)
     * @param empId               员工Id
     * @param onboardingCompanyId 要入职的用工单位 只有预登记人员才可能用到
     * @param tokenUser           登录用户
     * @return 员工信息
     */
    List<EmpFieldDTO> getEmpFieldList(Integer queryType, String empId, String onboardingCompanyId, TokenUser tokenUser);

    /**
     * 判断身份证号同租户下是否已存在
     * 通租户下、非离职状态，同一个身份证号，只能有一个
     *
     * @return
     */
    Map<String, Object> isExit(String siteId, String empInfo, String idCard);

    /**
     * 更新dict
     *
     * @param dictItem          查询结果(修改前)
     * @param dictItemUpdateDTO 更新内容(修改后)
     * @param tokenUser         登录用户
     */
    void updateDict(DictItemDO dictItem, DictItemUpdateDTO dictItemUpdateDTO, TokenUser tokenUser);

    /**
     * 查询dict
     *
     * @param dictItem  查询结果
     * @param tokenUser 登录用户
     */
    Integer selectDict(DictItemDO dictItem, TokenUser tokenUser);

    void updatePhoneById(String userId, String phone);
}


